package com.trio.breakFast.util.ftp;

import com.trio.breakFast.sys.exception.ServiceException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;


/**
 * Created by ienovo on 2016/8/11.
 */

//
public class FTPfUpAndDownUtil {

    /**
     *      * 上传文件（可供Action/Controller层使用）
     *      * @param hostname FTP服务器地址
     *      * @param port   FTP服务器端口号
     *      * @param username   FTP登录帐号
     *      * @param password   FTP登录密码
     *      * @param pathname   FTP服务器保存目录
     *      * @param fileName   上传到FTP服务器后的文件名称
     *      * @param inputStream 输入文件流
     *      * @return
     *      
     */
    public static boolean uploadFile(String hostname, int port, String username,
                                     String password, String pathname, String fileName, InputStream inputStream) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        //ftpClient.setControlEncoding("UTF-8");
        try {
            //连接FTP服务器
            ftpClient.connect(hostname, port);
            //登录FTP服务器
            ftpClient.login(username, password);
            //是否成功登录FTP服务器
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                return flag;
            }

            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.makeDirectory(pathname);
            ftpClient.changeWorkingDirectory(pathname);
            ftpClient.storeFile(fileName, inputStream);
            inputStream.close();
            ftpClient.logout();


            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }


    /**
     * 上传文件（可对文件进行重命名）
     *
     * @param hostname       FTP服务器地址
     * @param port           FTP服务器端口号
     * @param username       FTP登录帐号
     * @param password       FTP登录密码
     * @param pathname       FTP服务器保存目录
     * @param filename       上传到FTP服务器后的文件名称
     * @param originfilename 待上传文件的名称（绝对地址）
     * @return
     */
    public static boolean uploadFileFromProduction(String hostname, int port, String username,
                                                   String password, String pathname, String filename, String originfilename) {
        boolean flag = false;
        try {
            InputStream inputStream = new FileInputStream(new File(originfilename));
            flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 上传文件（不可以进行文件的重命名操作）
     *
     * @param hostname       FTP服务器地址
     * @param port           FTP服务器端口号
     * @param username       FTP登录帐号
     * @param password       FTP登录密码
     * @param pathname       FTP服务器保存目录
     * @param originfilename 待上传文件的名称（绝对地址）
     * @return
     */
    public static boolean uploadFileFromProduction(String hostname, int port, String username,
                                                   String password, String pathname, String originfilename) {
        boolean flag = false;
        try {
            String fileName = new File(originfilename).getName();
            InputStream inputStream = new FileInputStream(new File(originfilename));
            flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 删除文件
     *
     * @param hostname FTP服务器地址
     * @param port     FTP服务器端口号
     * @param username FTP登录帐号
     * @param password FTP登录密码
     * @param pathname FTP服务器保存目录
     * @param filename 要删除的文件名称
     * @return
     */
    public static boolean deleteFile(String hostname, int port, String username, String password,
                                     String pathname, String filename) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        try {
            //连接FTP服务器
            ftpClient.connect(hostname, port);
            //登录FTP服务器
            ftpClient.login(username, password);
            //验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                return flag;
            }
            //切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);

            InputStream ins = ftpClient.retrieveFileStream(filename);
            if (ins == null) {
                //System.out.println("文件不存在");
            } else {
                ftpClient.dele(filename);
                // System.out.println("文件存在,删除...");
            }

            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.logout();
                } catch (IOException e) {

                }
            }
        }
        return flag;
    }

    /**
     *      * 下载文件
     *      * @param hostname FTP服务器地址
     *      * @param port   FTP服务器端口号
     *      * @param username   FTP登录帐号
     *      * @param password   FTP登录密码
     *      * @param pathname   FTP服务器文件目录
     *      * @param filename   文件名称
     *      * @param localpath 下载后的文件路径
     *      * @return
     *      
     */


    public static String downloadFile(String hostname, int port, String username,
                                           String password, String pathname, String filename) {
        InputStream inputStream = null;
        File localFile = null;
        File file1 = null;
        MultipartFile multipartFile = null;
        boolean flag = false;
        String picture = null;
        String localpath = "E:/image";

        //System.out.println("***************** down 文件...");
        //       file1 = new File(localpath + "/" + filename);

//        if (file1.exists()) {
//            file1.delete();
//            System.out.println(" down 文件存在,删除...");
//        }

        FTPClient ftpClient = new FTPClient();
        try {
            //连接FTP服务器
            ftpClient.connect(hostname, port);
            //登录FTP服务器
            ftpClient.login(username, password);
            //验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                // return flag;
                throw new ServiceException("头像加载失败");
            }
            //切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);

            inputStream = ftpClient.retrieveFileStream(filename);
            if (inputStream == null) {
                //System.out.println(" *****  头像不存在");
                //throw new ServiceException("头像不存在");

            } else {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int i = -1;
                while ((i = inputStream.read()) != -1) {
                    baos.write(i);
                }
                picture = baos.toString();
                //System.out.println(" *****  down 文件 return picture");
                // System.out.println(" *****  down 文件 lenth:" + picture.length());
            }
            //System.out.println(" *****  down 文件 picture = baos.toString()");
//            if (inputStream==null) {
//                System.out.println(" *****  down 文件 inputStream==null");
//            }
//            if (picture==null) {
//                System.out.println(" *****  down 文件 picture==null");
//            }
//            FTPFile[] ftpFiles = ftpClient.listFiles();
//            for (FTPFile file : ftpFiles) {
//                if (filename.equalsIgnoreCase(file.getName())) {
//                    localFile = new File(localpath + "/" + file.getName());
//                    OutputStream os = new FileOutputStream(localFile);
//                    ftpClient.retrieveFile(file.getName(), os);
//                    os.close();
//                }
//            }
//            multipartFile = (MultipartFile) localFile;


            ftpClient.logout();
            flag = true;

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.logout();
                } catch (IOException e) {

                }
            }
        }

        return picture;
    }
}
